package org.Shiikong_Memory.SakuraBlockFrame.BasisTool;

import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.*;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;

/**
 * MessageTool 类用于构建和发送带有样式、点击事件和悬停事件的消息给玩家。
 * 它提供了一个建造者模式的接口，允许用户逐步构建复杂的消息。
 * @author Shiikong_Memory
 * @version 1.0
 */
public class MessageTool {
    /**
     * 存储最终要发送的消息组件列表。
     */
    public final List<BaseComponent> components;
    /**
     * 临时存储替换占位符后的消息组件列表。
     */
    private final List<BaseComponent> tempComponents;
    /**
     * 消息的发送类型，如聊天框、动作栏或系统消息。
     */
    private final ChatMessageType messageType;

    /**
     * 私有构造函数，通过建造者模式创建 MessageTool 实例。
     *
     * @param builder 用于构建 MessageTool 的建造者对象。
     */
    private MessageTool(Builder builder) {
        this.components = builder.components;
        this.messageType = builder.messageType;
        this.tempComponents = new ArrayList<>();
    }

    /**
     * 用于获取一个新的建造者实例。
     *
     * @return 一个新的 Builder 实例。
     */
    public static Builder builder() {
        return new Builder();
    }

    /**
     * 使用建造者模式构建 MessageTool 实例。
     */
    public static class Builder {
        /**
         * 存储正在构建的消息组件列表。
         */
        private final List<BaseComponent> components = new ArrayList<>();
        /**
         * 颜色符号，用于替换为 Minecraft 的颜色代码，默认值为 '&'。
         */
        private char colorSymbol = '&'; // 新增颜色符号字段，默认使用&
        /**
         * 消息的发送类型，默认为聊天框。
         */
        private ChatMessageType messageType = ChatMessageType.CHAT;

        /**
         * 设置颜色符号的方法。
         *
         * @param symbol 新的颜色符号。
         * @return 当前 Builder 实例，支持链式调用。
         */
        public Builder withColorSymbol(char symbol) {
            this.colorSymbol = symbol;
            return this;
        }

        /**
         * 向消息中添加文本，并将颜色符号转换为 Minecraft 的颜色代码。
         *
         * @param text 要添加的文本。
         * @return 当前 Builder 实例，支持链式调用。
         */
        public Builder addText(String text) {
            // 转换颜色符号为MC格式，同时保留原始符号
            String converted = text.replace(colorSymbol, '§');
            components.add(new TextComponent(converted));
            return this;
        }

        /**
         * 为消息组件设置样式。
         *
         * @param color 要设置的颜色。
         * @param bold 是否加粗。
         * @return 当前 Builder 实例，支持链式调用。
         */
        public Builder withStyle(ChatColor color, boolean bold) {
            BaseComponent last = getLastComponent();
            last.setColor(color.asBungee());
            last.setBold(bold);
            return this;
        }

        /**
         * 为消息组件设置点击事件。
         *
         * @param action 点击事件的动作类型。
         * @param value 点击事件的值。
         * @return 当前 Builder 实例，支持链式调用。
         */
        public Builder withClickEvent(ClickEvent.Action action, String value) {
            getLastComponent().setClickEvent(new ClickEvent(action, value));
            return this;
        }

        /**
         * 为消息组件设置悬停事件。
         *
         * @param action 悬停事件的动作类型。
         * @param text 悬停时显示的文本。
         * @return 当前 Builder 实例，支持链式调用。
         */
        public Builder withHoverEvent(HoverEvent.Action action, String text) {
            getLastComponent().setHoverEvent(new HoverEvent(action, new ComponentBuilder(text).create()));
            return this;
        }

        /**
         * 获取消息组件，如果列表为空，则添加一个新的文本组件。
         *
         * @return 最后一个消息组件。
         */
        private BaseComponent getLastComponent() {
            if (components.isEmpty()) {
                components.add(new TextComponent());
            }
            return components.get(components.size() - 1);
        }

        /**
         * 构建并返回一个新的 MessageTool 实例。
         *
         * @return 一个新的 MessageTool 实例。
         */
        public MessageTool build() {
            return new MessageTool(this);
        }

        /**
         * 设置消息发送到动作栏。
         *
         * @return 当前 Builder 实例，支持链式调用。
         */
        public Builder toActionBar() {
            this.messageType = ChatMessageType.ACTION_BAR;
            return this;
        }

        /**
         * 设置消息作为系统消息发送。
         *
         * @return 当前 Builder 实例，支持链式调用。
         */
        public Builder toSystem() {
            this.messageType = ChatMessageType.SYSTEM;
            return this;
        }
    }

    /**
     * 替换消息组件中的占位符。
     *
     * @param placeholder 要替换的占位符。
     * @param replacement 替换后的内容。
     * @return 当前 MessageTool 实例，支持链式调用。
     */
    public MessageTool replacePlaceholder(String placeholder, String replacement) {
        components.forEach(component -> {
            // 将BaseComponent强制转换为TextComponent后调用实例方法
            if (((TextComponent) component).toLegacyText().contains(placeholder)) {
                TextComponent newComponent = new TextComponent(
                        ((TextComponent) component).toLegacyText().replace(placeholder, replacement)
                );
                copyComponentProperties(component, newComponent);
                tempComponents.add(newComponent);
            } else {
                tempComponents.add(component);
            }
        });
        components.clear();
        components.addAll(tempComponents);
        tempComponents.clear();
        return this;
    }

    /**
     * 复制一个消息组件的属性到另一个消息组件。
     *
     * @param source 源消息组件。
     * @param target 目标消息组件。
     */
    private void copyComponentProperties(BaseComponent source, BaseComponent target) {
        target.setColor(source.getColor());
        target.setBold(source.isBold());
        target.setClickEvent(source.getClickEvent());
        target.setHoverEvent(source.getHoverEvent());
    }

    /**
     * 将构建好的消息发送给指定的玩家。
     *
     * @param player 要接收消息的玩家。
     */
    public void sendTo(Player player) {
        // 根据消息类型发送到不同位置
        player.spigot().sendMessage(messageType, components.toArray(new BaseComponent[0]));
    }
}
